// Parser.h

// Parsovanie prikazov

#ifndef PARSER_H
#define PARSER_H

#ifdef COACH
#include "Coach/Interfaces/CoachMemory.h"
#include "Coach/Interfaces/CoachSynchronization.h"

#else  // COACH
//#include "Player/Interfaces/Synchronization.h"
#include "Player/Interfaces/Tactics.h"
#include "Player/Interfaces/Memory.h"

#endif // COACH
//#include "Common/Interfaces/MsgProcess.h"
//#include "Common/Protocol/ParseStructs.h"
#include "Common/Protocol/ServerSocket.h"
//#include "Common/Module.h"
//#include "Common/Main.h"

// Spracovava spravy prichadzajuce od soccer servera
class Parser : public Module, public MsgProcessInterface
{
	// Nazov timu (max. 31 znakov)
	char teamName[32];

#ifndef COACH
	// Realna hracska strana
	RealSide realSide;	
#endif // COACH
	
#ifdef COACH
	// Rozhranie pre pamat
	CoachMemoryInterface* memory;
	// Rozhranie pre synchronizaciu
	CoachSynchronizationInterface* synchro;
	
#else  // COACH
	// Rozhranie pre synchronizaciu
	SynchronizationInterface* synchro;
	// Pre zmenu formacii
	TacticsInterface* tactics;
	// Pre nastavovanie premennych
	MemoryInterface* memory;
#endif // COACH

public:
	// Konstruktor
	Parser();
	// Destruktor
	virtual ~Parser()
	{
	
	}

	// Implementacia rozhrania

	// Vrati interfejs pre zadanu ulohu
	virtual Interface* GetInterface(int task = -1) const;
	// Inicializovanie parsera
	virtual int Init(int argc, char **argv, int iTask = -1);
	// Parsuje spravu obdraznu od servera.
	virtual int ParseMsg(const char *msg);
	// Nastavi skutocnu stranu ihriska
	virtual void SetRealSide(RealSide rs);
	// Nastavi meno timu
	virtual void SetTeamName(const char *name);
	// Vrati meno timu
	virtual char * GetTeamName() { return teamName; }

protected:

	// --- Hlavne operacie parsera ---

	// Parsovanie zatvoriek
	const char* ParseBracket(const char* str, char* out);
	// Parsovanie jednoducheho objektu
	const char* ParseObj(const char* str, char* out);

	// --- Parsovanie jednotlivych sprav (pomocne operacie parsera) ---

	// Parsuje sa pocuta sprava
	int ParseHear(const char* msg);
	// Parsuje sa sprava na zmenu typu hracov
	int ParseChangePT(const char* msg);
	// Parsovanie inicializacnej spravy
	int ParseInit(const char* msg);
	// Parsovanie spravy ok ako odozvu zo servera
	int ParseOk(const char* msg);
	// Funkcia parsuje parametre hracov, ktore sa posielaju po (server_param)
	int ParsePlayerParam(const char* msg);
	// Funkcia parsuje typy hracov, ktore sa posielaju po (player_param)
	int ParsePlayerType(const char* msg);
	// Ziska herny mod z parsovaneho vstupneho retazca
	PlayMode ParsePlayMode(const char* str);
	// Parsuje spravu so stavom skore	
	int ParseScore(const char* msg);
	// Parsuje typ vlajky zo spravy see
	FlagType ParseSeeFlagType(const char* str);
	// Parsuje videnu znacku a naplni strukturu LANDMARK
	int ParseSeeLandmark(const char* str, LANDMARK* landmark);
	// Parsuje videneho hraca a naplni strukturu AGENT
	int ParseSeePlayer(const char* str1, const char* str2, AGENT* agent);
	// Parsuje parametre servera po sprave (init)
	int ParseServerParam(const char* msg);
	
#ifdef COACH
	// Parsuje spravu see_global (iba pre kouca)
	int ParseSeeGlobal(const char* msg);
#else  // COACH
	// Parsuje spravu see
	int ParseSee(const char* msg);
	// Parsuje spravu sense_body
	int ParseSenseBody(const char* msg);
#endif // COACH

	// CLANG
#ifndef COACH
		
	// Parsuje spravu obdrzanu zo servera. Tato metoda vola vsetky ostatne CLANG parsovacie metody.
	int CLangParseMsg(const char* msg);	
	// Vyhodnocuje podmienky vo vstupnej sprave (zatial iba true a false)
	int CLangEvaluateCondition(const char* msg);
	//
	int CLangParseDefine(const char* msg);
	//
	int CLangParseDefinerule(const char* msg);
	//
	int CLangParseFreeform(const char* msg);
	//
	int CLangParseChangeFormation(const char* msg);
	//
	int CLangParseSetParameter(const char* msg);
	//
	int CLangStripQuotes(const char* str, char* out);
		
#endif // COACH
};

#endif // PARSER_H
